home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok17.lha / IFFtoImage / Sources / ImgDemo.mod < prev    next >
Text File  |  1993-08-15  |  4KB  |  137 lines

  1. MODULE ImgDemo;
  2.  
  3. (* Program to show an Image. *)
  4.  
  5. FROM Intuition  IMPORT CloseWindow, WindowPtr,
  6.                        IDCMPFlagSet,Image, DrawImage,
  7.                        IDCMPFlags,ModifyIDCMP,SetWindowTitles,
  8.                        IntuiMessagePtr, ScreenPtr,
  9.                        CloseScreen;
  10. FROM Graphics   IMPORT RastPortPtr, ViewPortPtr;
  11. FROM Fenster    IMPORT BildSchirm, FensterAuf, Info, Farben;
  12. FROM SYSTEM     IMPORT ADR,ADDRESS;
  13. FROM FileSystem IMPORT Lookup, ReadBytes, Close, File, Response,
  14.                        ReadByteBlock, Length;
  15. FROM Exec       IMPORT MsgPortPtr, UByte;
  16. FROM Heap       IMPORT AllocMem, Deallocate;
  17. FROM Arts       IMPORT TermProcedure, Assert, CurrentLevel;
  18. FROM Arguments  IMPORT NumArgs, GetArg;
  19.  
  20. CONST
  21.   b   = 640;  h = 236;      (* screensize *)
  22.   FensterTitel="      IFFtoImage Demo     ";
  23.   ScreenTitel =" IFF-DEMO ";
  24.  
  25. VAR
  26.   wPtr                :WindowPtr;
  27.   sPtr                :ScreenPtr;
  28.   uPtr                :MsgPortPtr;
  29.   rPtr                :RastPortPtr;
  30.   vPtr                :ViewPortPtr;
  31.   finish              :BOOLEAN;
  32.   class               :IDCMPFlagSet;
  33.   code                :CARDINAL;
  34.   myLevel             :INTEGER;
  35.   Img                 :Image;                (* Image to display    *)
  36.   Name                :ARRAY[0..79] OF CHAR; (* name of .img-file   *)
  37.   length              :INTEGER;
  38.   buffsize,actual     :LONGINT;
  39.   buffPtr             :ADDRESS;
  40.   data                :File;
  41.  
  42.  
  43. PROCEDURE CleanUp;
  44.   BEGIN
  45.     IF myLevel >= CurrentLevel() THEN
  46.       IF wPtr # NIL  THEN CloseWindow(wPtr)   END;
  47.       IF sPtr # NIL  THEN CloseScreen(sPtr)   END;
  48.       IF buffPtr#NIL THEN Deallocate(buffPtr) END;
  49.     END;
  50.   END CleanUp;
  51.  
  52. PROCEDURE Initialisierung;
  53.   BEGIN
  54.     sPtr := BildSchirm(); (* open Screen *)
  55.     wPtr := FensterAuf(0,9,b,h,FensterTitel,sPtr);
  56.     uPtr := wPtr^.userPort;
  57.     rPtr := wPtr^.rPort;
  58.     vPtr := ADR(sPtr^.viewPort);
  59.     Farben(vPtr);
  60.     END Initialisierung;
  61.  
  62.    (* This is a somewhat stupid construction,
  63.       but I have to read Bytes and I need LONGINT's *)
  64. TYPE
  65.   BLOCK = RECORD
  66.     CASE :BOOLEAN OF
  67.       | TRUE : l:ARRAY[0..2] OF LONGINT;
  68.       | FALSE: b:ARRAY[0..11] OF UByte;
  69.     END;
  70.   END;
  71.  
  72.  
  73. VAR
  74.   block    :BLOCK;
  75.   dlength  :LONGINT;     (* length of data file *)
  76.  
  77.  
  78.  
  79. BEGIN             (* BEGIN of main program *)
  80.   Initialisierung;
  81.   myLevel := CurrentLevel();
  82.   TermProcedure(CleanUp); (* TermProcedure should be called
  83.                              very early!                      *)
  84.  
  85.   ModifyIDCMP(wPtr,IDCMPFlagSet{closeWindow});
  86.   SetWindowTitles(wPtr,ADR(FensterTitel),ADR(ScreenTitel));
  87.  
  88. (*------  get name:  ------*)
  89.  
  90.   IF NumArgs()#0 THEN
  91.     GetArg(1,Name,length);
  92.   ELSE
  93.     HALT;   (* no .img-file, nothing to do *)
  94.   END;
  95.  
  96. (*-------now get data file -------------------------*)
  97.  
  98.   Lookup(data,Name,1024,FALSE);  (* FALSE = OldFile *)
  99.   Assert(data.res=done,ADR("can't get file!"));
  100.  
  101.   Length(data,dlength);      (* need filelength for AllocMem *)
  102.   ReadByteBlock(data,block.b);
  103.   Assert(data.res=done,ADR("can't get block.b!"));
  104.   buffsize := dlength-12;
  105.  
  106.   buffPtr := NIL;
  107.  
  108.   AllocMem(buffPtr,buffsize,TRUE); (* TRUE = ChipMem! *)
  109.   Assert(buffPtr#NIL,ADR("couldn't get ChipMem"));
  110.  
  111.   ReadBytes(data,buffPtr,buffsize,actual);
  112.   Assert(actual=buffsize,ADR("couldn't get .img-data"));
  113.   Close(data);
  114.  
  115.               (* now put Image together *)
  116.   WITH Img DO
  117.      leftEdge := 10;
  118.      topEdge  := 10;
  119.         width := block.l[0];     (* read as UBytes, used as LONGINTs *)
  120.        height := block.l[1];
  121.         depth := block.l[2];
  122.     imageData := buffPtr;
  123.     planePick := 3;              (* for planes 0 and 1 to pick *)
  124.    planeOnOff := 0;
  125.     nextImage := NIL;
  126.   END;
  127.  
  128.   DrawImage(rPtr,ADR(Img),10,10);(* do it or die! *)
  129.  
  130.   finish := FALSE;               (* just to finish the whole thing! *)
  131.     REPEAT
  132.       class := Info(uPtr,code);
  133.       IF closeWindow IN class THEN finish := TRUE END;
  134.     UNTIL finish;
  135.  
  136. END ImgDemo.mod
  137.